package modelo;
/**
 * Clase que modela una celda del tablero, esto es, de la grilla del juego
 * @author Francisco Barreneche
 *
 */
public class Celda {
	//las coordenadas (x,y) de la celda en cuestion
	protected int x;
	protected int y;
	protected boolean pintadoBlanco;
	protected boolean pintadoNegro;
	
	//las cosas que puede o no tener
	protected Piso piso;
	protected Obstaculo obstaculo;
	protected Premio premio;
	protected Coleccionable coleccionable;
	
	
	/**
	 * Constructor que inicializa el estado interno de una celda vacia, sin objetos coleccionables, ni premios, ni obstaculos
	 * @param x La fila de la celda en cuestion en la matriz de celdas que es el tablero
	 * @param y La columna de la celda en cuestion en la matriz de celdas que es tablero
	 * @param p El piso de la celda
	 */
	public Celda(int x, int y, Piso p) {
		this.x = x;
		this.y = y;
		this.pintadoBlanco = false;
		this.pintadoBlanco = false;
		this.piso = p;
		//esto es lo minimo que necesita una celda el, resto de las cosas las podemos poner y sacar con setters
		this.obstaculo = null;
		this.premio = null;
		this.coleccionable = null;
	}
	
	
	/**
	 * Getter del atributo que indica la fila de la celda
	 * @return Un entero que representa la fila de la celda
	 */
	public int obtenerX() {
		return this.x;
	}
	
	/**
	 * Getter del atributo que indica la columna de la celda
	 * @return Un entero que representa la columna de la celda
	 */
	public int obtenerY() {
		return this.y;
	}
	
	/**
	 * Getter del atributo que indica el piso de la celda
	 * @return El piso de la celda
	 */
	public Piso obtenerPiso() {
		return this.piso;
	}
	
	/**
	 * Getter del atributo obstaculo de la celda
	 * @return En el caso de tener un obstaculo devuelve el obstaculo en cuestion, y devuelve nulo en caso contrario
	 */
	public Obstaculo obtenerObstaculo() {
		return this.obstaculo;
	}
	
	/**
	 * Getter del atributo premio de la celda
	 * @return En el caso de tener un premio devuelve el premio en cuestion, y devuelve nulo en caso contrario
	 */
	public Premio obtenerPremio() {
		return this.premio;
	}
	
	/**
	 * Getter del atributo coleccionable de la celda
	 * @return En el caso de tener un objeto coleccionable devuelve el coleccionable en cuestion, y devuelve nulo en caso contrario
	 */
	public Coleccionable obtenerColeccionable() {
		return this.coleccionable;
	}
	
	/**
	 * Operacion que permite determinar si la celda tiene un obstaculo o no
	 * @return Verdadero en el caso de que la celda tenga un obstaculo, falso en caso contrario
	 */
	public boolean hayObstaculo() {
		if(this.obstaculo != null) return true;
		else return false;
	}
	
	/**
	 * Operacion que permite determinar si la celda tiene un premio o no
	 * @return Verdadero en el caso de que la celda tenga un premio, falso en caso contrario
	 */
	public boolean hayPremio() {
		if(this.premio != null) return true;
		else return false;
	}
	
	/**
	 * Operacion que permite determinar si la celda tiene un objeto coleccionable o no
	 * @return Verdadero en el caso de que la celda tenga un coleccionable, falso en caso contrario
	 */
	public 	boolean hayColeccionable() {
		if(this.coleccionable != null) return true;
		else return false;
	}
	
	/**
	 * Operacion que permite determinar si la celda fue pintada de blanco o no
	 * @return Verdadero en el caso de que la celda este pintada de blanco, falso en caso contrario
	 */
	public boolean estaPintadoBlanco() {
		return this.pintadoBlanco;
	}
	
	/**
	 * Operacion que permite determinar si la celda fue pintada de negro o no
	 * @return Verdadero en el caso de que la celda este pintada de negro, falso en caso contrario
	 */
	public boolean estaPintadoNegro() {
		return this.pintadoNegro;
	}
	
	
	//comandos
	/**
	 * Elimina el obstaculo de la celda, esto es, pone el atributo obstaculo en nulo
	 */
	public void quitarObstaculo() {
		this.obstaculo = null;
	}
	
	/**
	 * Elimina el premio de la celda, esto es, pone el atributo premio en nulo
	 */
	public void quitarPremio() {
		this.premio = null;
	}
	
	/**
	 * Elimina el objeto coleccionable de la celda, esto es, poner el atributo coleccionable en nulo
	 */
	public void quitarColeccionable() {
		this.coleccionable = null;
	}
	
	/**
	 * Setter del atributo obstaculo de la celda
	 * @param o El obstaculo a ser puesto en la celda
	 */
	public void ponerObstaculo(Obstaculo o) {
		this.obstaculo = o;
	}
	
	/**
	 * Setter del atributo premio de la celda
	 * @param p El premio a ser puesto en la celda
	 */
	public void ponerPremio(Premio p) {
		this.premio = p;
	}
	
	/**
	 * Setter del atributo coleccionable de la celda
	 * @param c El objeto coleccionable a ser puesto en la celda
	 */
	public void ponerColeccionable(Coleccionable c) {
		this.coleccionable = c;
	}
	
	/**
	 * Pinta de blanco la celda
	 */
	public void pintarBlanco() {
		if(pintadoNegro) {
			this.pintadoNegro = false;
		}
		this.pintadoBlanco = true;
	}
	
	/**
	 * Pinta de negro la celda
	 */
	public void pintarNegro(){
		if(pintadoBlanco) {
			this.pintadoBlanco = false;
		}
		this.pintadoNegro = true;
	}
	
	
	

}
